resync v ADO.

Otázka od: Bohdan Voska

2. 12. 2002 18:25

Ahoj,
mam problem s metodou resync na recordset v ADO.Pokud mam SQL dotaz
"select
T1.*,T2.* from T1 left join T2 (T1.ID = T2.ID) tak pri resync to ohlasi
chybu "Key
value for this row was changed or deleted at the data store. The
local row is now deleted"
Je to v pripade, ze zaznam v T2 neexistuje. Pokud existuje je vsechno OK. V
BOL jsem se neco docetl o properties unique table, unique schema a unique
catalog, ale nevim co by se tam melo vyplnit.Pokud vite kde delam chybu, tak
mi pomozte.
                            Diky
Bohdan Voska
DELPHI 5 (SP2), MSSQL 2000

Odpovedá: Petr Kejval

3. 12. 2002 9:54

Zde Ti posilam demo priklad, který jsem pred casem tvoril pro sebe a své
kolegy.

Demo pro editaci Tabulek spojenych klauzuli JOIN.
Zadani:
SELECT
  Zkouska.dbo.Master.ID,
  Zkouska.dbo.Master.Nazev,
  Zkouska.dbo.Master.IDCiselnik1,
  Zkouska.dbo.Master.IDCiselnik2,
  Zkouska.dbo.Ciselnik1.Nazev AS Expr1,
  Zkouska.dbo.Ciselnik2.Nazev AS Expr2
FROM dbo.Master
  LEFT OUTER JOIN
    Zkouska.dbo.Ciselnik2 ON Zkouska.dbo.Master.IDCiselnik2 =
      Zkouska.dbo.Ciselnik2.IDCiselnik2
  LEFT OUTER JOIN
    Zkouska.dbo.Ciselnik1 ON Zkouska.dbo.Master.IDCiselnik1 =
      Zkouska.dbo.Ciselnik1.IDCiselnik1

Vyse uvedenym prikazem spojime Tabulky Master, Ciselnik1 a Ciselnik2, na
formulari chceme editovat pouze data tabulky Master, ale data tabulek
Ciselnik1
a Ciselnik2 editovat nechceme.


Reseni:
V udalosti ADODataset1.AfterOpen se nastavi Properties 'Unique Catalog',
'Unique Schema','Unique Table','Resync Command'. V nasem pripade je
 Item['Unique Catalog'].Value:='Zkouska';
 Item['Unique Schema'].Value:='dbo';
 Item['Unique Table'].Value:='Master';
 Item['Update Criteria'].Value:=adCriteriaKey;
 Item['Resync Command'].Value:=
      'SELECT'+
        'Zkouska.dbo.Master.ID,'+
        'Zkouska.dbo.Master.Nazev,'+
        'Zkouska.dbo.Master.IDCiselnik1,'+
        'Zkouska.dbo.Master.IDCiselnik2,'+
        'Zkouska.dbo.Ciselnik1.Nazev AS Expr1,'+
        'Zkouska.dbo.Ciselnik2.Nazev AS Expr2'+
      'FROM Zkouska.dbo.Master'+
        'LEFT OUTER JOIN'+
          'Zkouska.dbo.Ciselnik2 ON Zkouska.dbo.Master.IDCiselnik2 ='+
            Zkouska.dbo.Ciselnik2.IDCiselnik2'+
        'LEFT OUTER
JOIN'+
          'Zkouska.dbo.Ciselnik1 ON Zkouska.dbo.Master.IDCiselnik1
='+
            Zkouska.dbo.Ciselnik1.IDCiselnik1'+
        'WHERE Zkouska.dbo.Master.ID = ?'
kde ID je primarni klic tabulky Master
podle ktereho se zaznam resynchronizuje, to znamena, ze kurzor po provedeni
Refresh bude stat na tom samem zaznamu a nebude skakat na zacatek tabulky.
Pro vyse uvedenou cinnost je ale nutne zaroven nastavit vlastnost
opUseResyncForRefresh v Options ADODataSetu na True.

Akce ADODataset1.Delete - probehne pouze nad tabulkou 'Unique Table' coz je
  tabulka Master. To znamena, ze se vymaze pouze zaznam v tabulce Master a
  prijoinovane zaznamy v Ciselnik1 a Ciselnik2 ne nevymazou.
Akce ADODataSet1.Insert - protoze, prikaz insert by se pokousel vlozit data
i do
  prijoinovanych tabulek Ciselnik1 a Ciselnik2 je nutne zajistit, aby Fieldy
  prislusejici temto tabulkam nebyly editovany
Akce ADODataSet1.Edit - protoze, príkaz Edit by se pokousel editovat data i
v
  prijoinovaných tabulkach Ciselnik1 a Ciselnik2 je nutne zajistit, aby
Fieldy
  prislusejici temto tabulkam nebyly editovany
Akce ADODataSet1.Refresh - provede Refresh celeho DataSetu zaznam po zaznamu
pomocí prikazu zapsaného v Item['Resync Command'].Value;
Akce ADODataSet1.ADOResync(arCurrent, rvAllValues) - provede refresh pouze
aktualniho zaznamu.

Petr Kejval


> Ahoj,
> mam problem s metodou resync na recordset v ADO.Pokud mam SQL dotaz
"select
> T1.*,T2.* from T1 left join T2 (T1.ID = T2.ID) tak pri resync to ohlasi
> chybu "Key
value for this row was changed or deleted at the data store.
The
> local row is now deleted"
> Je to v pripade, ze zaznam v T2 neexistuje. Pokud existuje je vsechno OK.
V
> BOL jsem se neco docetl o properties unique table, unique schema a unique
> catalog, ale nevim co by se tam melo vyplnit.Pokud vite kde delam chybu,
tak
> mi pomozte.
>
> Diky
> Bohdan Voska
> DELPHI 5 (SP2), MSSQL 2000
>
>

Odpovedá: Bohdan Voska

3. 12. 2002 10:53




> Pro vyse uvedenou cinnost je ale nutne zaroven nastavit vlastnost
> opUseResyncForRefresh v Options ADODataSetu na True.
>

Diky za vycerpavajici odpoved, jen nevim, kde najdu vlastnost
opUseResyncForRefresh. Mozna to bude tim, ze mame adoexpres od borlandu a ta
tuto vlastnost nema. Pokud ano, tak bych poprosil co ta vlastnost dela,
abych vedel co adoexpres neumi nebo pod cim to ma schovane, pokud ne tak kde
tu vlastnost presne najdu.


Bohdan Voska

Odpovedá: Petr Kejval

3. 12. 2002 13:40

Omlouvam se,
nenapsal jsem, ze pouzivam komponenty Adonis. Tam se pomoci
opUseResyncForRefresh ridi zda se pri volani metody Datasetu Refresh pouzije
metoda Recorsetu Resync(adAdffectAll,adResyncAllValues) nebo metoda
recordsetu Requery.
Petr Kejval

> Diky za vycerpavajici odpoved, jen nevim, kde najdu vlastnost
> opUseResyncForRefresh. Mozna to bude tim, ze mame adoexpres od borlandu a
ta
> tuto vlastnost nema. Pokud ano, tak bych poprosil co ta vlastnost dela,
> abych vedel co adoexpres neumi nebo pod cim to ma schovane, pokud ne tak
kde
> tu vlastnost presne najdu.
>
>
> Bohdan Voska
>
>